package br.com.tcf.dao;


import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import br.com.tcf.Conexao.Connection;
import br.com.tcf.Conexao.DaoResource;
import br.com.tcf.entidades.DiaSemana;
import br.com.tcf.entidades.Empresa;
import br.com.tcf.entidades.ProdutoDetalhePromocao;
import br.com.tcf.entidades.Promocao;


public class PromocaoDao extends DaoResource{

	private static Connection connection = new Connection();
	private List<Promocao> promos;
	private List<ProdutoDetalhePromocao> prodPromo;

	public void grava_promocao(Promocao promo){	
		super.saveOrUpdate(connection, promo);
	}

	public void exclui_promocao(Promocao promo){		
		super.delete(connection, promo);
	}

	@SuppressWarnings("unchecked")
	public List<Promocao> listar_promocoes(Empresa emp){
		promos = new ArrayList<Promocao>();
		promos = super.select(connection, "FROM Promocao WHERE empresa = :id","id", emp);
		return promos;
	}

	@SuppressWarnings("unchecked")
	public List<Promocao> listar_promocoes_ativas(Empresa emp){
		promos = new ArrayList<Promocao>();
		super.evict(connection, promos);
		promos = super.select(connection, "SELECT DISTINCT p FROM Promocao p LEFT JOIN FETCH p.diaSemana "
				+ "WHERE p.empresa = :emp AND data_final > current_date() AND current_date() >= data_inicial"
				+ "   OR p.empresa = :emp AND data_final is null          AND current_date() >= data_inicial", "emp", emp);

		int i = 0;
		for (i = 0; i < promos.size(); i++) {
			if(promos.get(i).getDia_especifico() == true){
				if(verificaPromoPorDia(promos.get(i)) == false){
					promos.remove(promos.get(i));
				}							
			}
		}

		return promos;
	}

	@SuppressWarnings("unchecked")
	public List<Promocao> listar_promocoes_a_iniciar(Empresa emp){
		promos = new ArrayList<Promocao>();
		promos = super.select(connection, "FROM Promocao WHERE empresa = :emp AND data_final > current_date() AND current_date() < data_inicial "
														 + "OR empresa = :emp AND data_final is null          AND current_date() < data_inicial", "emp", emp);
		return promos;
	}

	@SuppressWarnings("unchecked")
	public List<Promocao> listar_promocoes_finalizadas(Empresa emp){
		promos = new ArrayList<Promocao>();
		promos = super.select(connection, "FROM Promocao WHERE empresa = :id AND data_final <= current_date()","id", emp);
		return promos;
	}

	@SuppressWarnings("unchecked")
	public List<ProdutoDetalhePromocao> listar_produtos_por_promocao (Promocao promo){
		prodPromo = new ArrayList<ProdutoDetalhePromocao>();
		prodPromo = super.select(connection, "FROM ProdutoDetalhePromocao WHERE promocao =:id", "id",promo);
		return prodPromo;
	}

	public void vincularProdutoPromocao(ProdutoDetalhePromocao proPromo){
		super.saveOrUpdate(connection, proPromo);
	}

	public void desvincularProdutoPromocao(ProdutoDetalhePromocao proPromo){
		super.delete(connection, proPromo);
	}

	public double somarProdutos(Promocao promo){
		try{
			return (double) super.select(connection, "SELECT SUM(vl_promocional) FROM ProdutoDetalhePromocao WHERE promocao = :id","id", promo).get(0);
		}catch(NullPointerException e){
			return 0;
		}
	}

	public Boolean verificaPromoPorDia(Promocao promocao) {
		DiaSemana dia = new DiaSemana();

		Date date = new Date();  
		Calendar c = new GregorianCalendar();  
		c.setTime(date);  

		dia.setId_dia_semana(c.get(Calendar.DAY_OF_WEEK));	

		if(promocao.getDiasSemana().contains(dia)){
			return true;
		}else{
			return false;
		}
	}

	public Boolean verificaPromoPorDia(int dia, Promocao promocao) {
		DiaSemana d = new DiaSemana();

		d.setId_dia_semana(dia);	

		if(promocao.getDiasSemana().contains(d)){
			return true;
		}else{
			return false;
		}
	}
}
